package com.wjk.kylin.mall.common.web.stream;

import org.apache.ibatis.session.ResultHandler;
import org.springframework.lang.NonNull;
import org.springframework.util.Assert;

import java.util.List;
import java.util.function.Consumer;

/**
 * 默认 查询执行器
 *
 * @param <T>
 * @author wangjinkui
 */
public class DefaultResultHandler<T> extends AbstractResultHandler<T> {
    //数据查询回调
    private final Consumer<List<T>> callback;
    //数据查询回调
    private final Consumer<ResultHandler<T>> query;

    /**
     * @param query
     * @param callback
     */
    public DefaultResultHandler(@NonNull Consumer<ResultHandler<T>> query,
                                @NonNull Consumer<List<T>> callback) {
        this.callback = callback;
        this.query = query;
    }

    /**
     * 执行数据查询方法
     */
    public void batchHandle() {
        Assert.notNull(query, "query is bank");
        //1.执行查询数据
        query.accept(this);
        //2.处理最后一个批次的查询结果数据
        this.lastHandle();
    }

    /**
     * 执行数据处理方法
     */
    @Override
    public void handle() {
        try {
            Assert.notNull(callback, "callback is bank");
            //1.执行处理数据
            callback.accept(list);
        } finally {
            // 处理完每批数据后后将临时清空
            size = 0;
            list.clear();
        }
    }

}
